<!DOCTYPE html>
<html lang="zh-CN">
<head>

    <!--[if lt IE 9]>
        <style>body {display: none; background: none !important} </style>
        <meta http-equiv="Refresh" Content="0; url=//outdatedbrowser.com/" />
    <![endif]-->

<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="format-detection" content="telephone=no" />
<meta name="author" content="GosuncnStudio" />



<meta name="description" content="iOS第三方框架管理高效快速的软件开发离不开一些成熟的第三方框架,我们需要一些方法把自己和别人写的代码组织起来，高效地利用，并以此为基础构建软件。这就涉及到使用和维护框架。当然我们可以简单的从github中找到需要的代码，download下来并手动集成到你的项目中。但这种做法费时费力，且难以维护。这个时候我们需要一套适用于iOS的第三方框架依赖管理器。 CocoaPodsCocoaPods 是一">
<meta name="keywords" content="iOS">
<meta property="og:type" content="article">
<meta property="og:title" content="Carthage 使用手册">
<meta property="og:url" content="https://gosuncnstudio.github.io/2018/01/04/Carthage-使用手册/index.html">
<meta property="og:site_name" content="高新兴移动开发小组">
<meta property="og:description" content="iOS第三方框架管理高效快速的软件开发离不开一些成熟的第三方框架,我们需要一些方法把自己和别人写的代码组织起来，高效地利用，并以此为基础构建软件。这就涉及到使用和维护框架。当然我们可以简单的从github中找到需要的代码，download下来并手动集成到你的项目中。但这种做法费时费力，且难以维护。这个时候我们需要一套适用于iOS的第三方框架依赖管理器。 CocoaPodsCocoaPods 是一">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/header.png">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/carthage-settings.gif">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/newScript.png">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/configScript.png">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/settingProject.png">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/manageSchemes.png">
<meta property="og:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/shareSchemes.png">
<meta property="og:updated_time" content="2018-01-08T05:56:11.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Carthage 使用手册">
<meta name="twitter:description" content="iOS第三方框架管理高效快速的软件开发离不开一些成熟的第三方框架,我们需要一些方法把自己和别人写的代码组织起来，高效地利用，并以此为基础构建软件。这就涉及到使用和维护框架。当然我们可以简单的从github中找到需要的代码，download下来并手动集成到你的项目中。但这种做法费时费力，且难以维护。这个时候我们需要一套适用于iOS的第三方框架依赖管理器。 CocoaPodsCocoaPods 是一">
<meta name="twitter:image" content="https://gosuncnstudio.github.io/img/Carthage-使用手册/header.png">

<link rel="apple-touch-icon" href= "/apple-touch-icon.png">




    <link rel="shortcut icon" href="/img/favicon.png">



    <link href="//cdn.bootcss.com/animate.css/3.5.1/animate.min.css" rel="stylesheet">



    <link href="//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.css" rel="stylesheet">



    <script src="//cdn.bootcss.com/pace/1.0.2/pace.min.js"></script>
    <link href="//cdn.bootcss.com/pace/1.0.2/themes/blue/pace-theme-minimal.css" rel="stylesheet">


<link rel="stylesheet" href="/css/style.css">



<link href="//cdn.bootcss.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet">


<title>Carthage 使用手册 | 高新兴移动开发小组</title>

<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

<script>
    var yiliaConfig = {
        fancybox: true,
        animate: true,
        isHome: false,
        isPost: true,
        isArchive: false,
        isTag: false,
        isCategory: false,
        fancybox_js: "//cdn.bootcss.com/fancybox/2.1.5/jquery.fancybox.min.js",
        scrollreveal: "//cdn.bootcss.com/scrollReveal.js/3.1.4/scrollreveal.min.js",
        search: true
    }
</script>


    <script> yiliaConfig.jquery_ui = [false]; </script>



    <script> yiliaConfig.rootUrl = "\/";</script>






</head>
<body>
  <div id="container">
    <div class="left-col">
    <div class="overlay"></div>
<div class="intrude-less">
    <header id="header" class="inner">
        <a href="/" class="profilepic">
            <img src="/img/avatar.png" class="animated zoomIn">
        </a>
        <hgroup>
          <h1 class="header-author"><a href="/">GosuncnStudio</a></h1>
        </hgroup>

        

        
            <form id="search-form">
            <input type="text" id="local-search-input" name="q" placeholder="search..." class="search form-control" autocomplete="off" autocorrect="off" searchonload="false" />
            <i class="fa fa-times" onclick="resetSearch()"></i>
            </form>
            <div id="local-search-result"></div>
            <p class='no-result'>No results found <i class='fa fa-spinner fa-pulse'></i></p>
        


        
            <div id="switch-btn" class="switch-btn">
                <div class="icon">
                    <div class="icon-ctn">
                        <div class="icon-wrap icon-house" data-idx="0">
                            <div class="birdhouse"></div>
                            <div class="birdhouse_holes"></div>
                        </div>
                        <div class="icon-wrap icon-ribbon hide" data-idx="1">
                            <div class="ribbon"></div>
                        </div>
                        
                        <div class="icon-wrap icon-link hide" data-idx="2">
                            <div class="loopback_l"></div>
                            <div class="loopback_r"></div>
                        </div>
                        
                        
                    </div>
                    
                </div>
                <div class="tips-box hide">
                    <div class="tips-arrow"></div>
                    <ul class="tips-inner">
                        <li>Menu</li>
                        <li>Tags</li>
                        
                        <li>Friends</li>
                        
                        
                    </ul>
                </div>
            </div>
        

        <div id="switch-area" class="switch-area">
            <div class="switch-wrap">
                <section class="switch-part switch-part1">
                    <nav class="header-menu">
                        <ul>
                        
                            <li><a href="/">主页</a></li>
                        
                            <li><a href="/archives/">所有文章</a></li>
                        
                            <li><a href="/tags/">标签云</a></li>
                        
                            <li><a href="/开源项目主页/">开源项目主页</a></li>
                        
                            <li><a href="/优秀推荐/">优秀推荐</a></li>
                        
                        </ul>
                    </nav>
                    <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" href="mailto:gosuncn_develop@163.com" title="Email"></a>
                            
                                <a class="fa GitHub" href="https://github.com/GosuncnStudio" title="GitHub"></a>
                            
                        </ul>
                    </nav>
                </section>
                
                
                <section class="switch-part switch-part2">
                    <div class="widget tagcloud" id="js-tagcloud">
                        <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/CocoaPods/">CocoaPods</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Git/">Git</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SVN/">SVN</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/android/">android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hexo/">hexo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/iOS/">iOS</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/statusBar/">statusBar</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/video/">video</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/内存泄露/">内存泄露</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/注解/">注解</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/生活/">生活</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/线程切换/">线程切换</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/视频码流/">视频码流</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/适配/">适配</a></li></ul>
                    </div>
                </section>
                
                
                
                <section class="switch-part switch-part3">
                    <div id="js-friends">
                    
                      <a class="main-nav-link switch-friends-link" href="https://hexo.io">Hexo</a>
                    
                      <a class="main-nav-link switch-friends-link" href="https://github.com/GosuncnStudio">GitHub</a>
                    
                      <a class="main-nav-link switch-friends-link" href="http://moxfive.xyz/">MOxFIVE</a>
                    
                    </div>
                </section>
                

                
            </div>
        </div>
    </header>                
</div>
    </div>
    <div class="mid-col">
      <nav id="mobile-nav">
      <div class="overlay">
          <div class="slider-trigger"></div>
          <h1 class="header-author js-mobile-header hide"><a href="/" title="回到主页">GosuncnStudio</a></h1>
      </div>
    <div class="intrude-less">
        <header id="header" class="inner">
            <a href="/" class="profilepic">
                <img src="/img/avatar.png" class="animated zoomIn">
            </a>
            <hgroup>
              <h1 class="header-author"><a href="/" title="回到主页">GosuncnStudio</a></h1>
            </hgroup>
            
            <nav class="header-menu">
                <ul>
                
                    <li><a href="/">主页</a></li>
                
                    <li><a href="/archives/">所有文章</a></li>
                
                    <li><a href="/tags/">标签云</a></li>
                
                    <li><a href="/开源项目主页/">开源项目主页</a></li>
                
                    <li><a href="/优秀推荐/">优秀推荐</a></li>
                
                <div class="clearfix"></div>
                </ul>
            </nav>
            <nav class="header-nav">
                        <ul class="social">
                            
                                <a class="fa Email" target="_blank" href="mailto:gosuncn_develop@163.com" title="Email"></a>
                            
                                <a class="fa GitHub" target="_blank" href="https://github.com/GosuncnStudio" title="GitHub"></a>
                            
                        </ul>
            </nav>
        </header>                
    </div>
    <link class="menu-list" tags="Tags" friends="Friends" about="About Me"/>
</nav>
      <div class="body-wrap"><article id="post-Carthage-使用手册" class="article article-type-post" itemscope itemprop="blogPost">
  
    <div class="article-meta">
      <a href="/2018/01/04/Carthage-使用手册/" class="article-date">
      <time datetime="2018-01-04T02:24:48.000Z" itemprop="datePublished">2018-01-04</time>
</a>


    </div>
  
  <div class="article-inner">
    
      <input type="hidden" class="isFancy" />
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Carthage 使用手册
    </h1>
  

      </header>
      
      <div class="article-info article-info-post">
        
    <div class="article-category tagcloud">
    <a class="article-category-link" href="/categories/教程/">教程</a>
    </div>


        
    <div class="article-tag tagcloud">
        <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/iOS/">iOS</a></li></ul>
    </div>

        <div class="clearfix"></div>
      </div>
      
    
    <div class="article-entry" itemprop="articleBody">
      
          
        <p><img src="/img/Carthage-使用手册/header.png" alt="header.png"></p>
<h2 id="iOS第三方框架管理"><a href="#iOS第三方框架管理" class="headerlink" title="iOS第三方框架管理"></a>iOS第三方框架管理</h2><p>高效快速的软件开发离不开一些成熟的第三方框架,我们需要一些方法把自己和别人写的代码组织起来，高效地利用，并以此为基础构建软件。这就涉及到使用和维护框架。当然我们可以简单的从<a href="https://github.com" target="_blank" rel="noopener">github</a>中找到需要的代码，download下来并手动集成到你的项目中。但这种做法费时费力，且难以维护。这个时候我们需要一套适用于iOS的第三方框架依赖管理器。</p>
<h4 id="CocoaPods"><a href="#CocoaPods" class="headerlink" title="CocoaPods"></a>CocoaPods</h4><p><a href="http://cocoapods.org" target="_blank" rel="noopener">CocoaPods</a> 是一个已经有五年历史的ruby程序，用于帮助获取和管理依赖框架。CocoaPods 的主要原理是框架的提供者通过编写合适的 PodSpec 文件来提供框架的基本信息，包括仓库地址，需要编译的文件，依赖等。用户使用 Podfile 文件指定想要使用的框架，CocoaPods 会创建一个新的工程来管理这些框架和它们的依赖，并把所有这些框架编译到成一个<em>静态的</em>libPod.a。然后新建一个 workspace 包含你原来的项目和这个新的框架项目，最后在原来的项目中使用这个 libPods.a。<br><a id="more"></a><br>这是一种“侵入式”的集成方式，它会修改你的项目配置和结构。</p>
<p>在实际使用过程中我们发现Cocoapods与SVN存在不兼容性，在使用SVN管理Cocoapods资源的时候需要忽略一些文件（Pods、Podfile.lock）；或者只提交Podfile文件，并在另一个工作环境中运行pod install进行配置。</p>
<h4 id="iOSUniversalLibs"><a href="#iOSUniversalLibs" class="headerlink" title="iOSUniversalLibs"></a>iOSUniversalLibs</h4><p>为了简化操作，我们将常用框架进行整合并封装进iOSUniversalLibs中<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">svn://172.17.0.2/syun/trunk/source/code/Common/iOS/libs/iOSUniversalLibs</span><br></pre></td></tr></table></figure></p>
<p>该库包含了主要的网络请求、HUD提示、网络图片下载、下拉加载等框架，并加以维护。</p>
<p>该库解决了SVN版本管控的冲突，但无法根据具体项目配置需要的框架，且无法同步第三方框架版本，需要人工维护，存在很大的局限性。</p>
<h4 id="Carthage"><a href="#Carthage" class="headerlink" title="Carthage"></a>Carthage</h4><p><a href="https://github.com/Carthage/Carthage" target="_blank" rel="noopener">Carthage</a> 是在 Cocoa Touch Framework 和 Swift 发布后出现的专门针对 Framework 进行的包管理工具。</p>
<p>Carthage 相比 CocoaPods，采用的是完全不同的一条道路。Carthage 只支持动态框架，它仅负责将项目 clone 到本地并将对应的 Cocoa Framework target 进行构建。之后你需要自行将构建好的 framework 添加到项目中。和 CocoaPods 需要提交和维护框架信息不同，Carthage 是去中心化的 它直接从 git 仓库获取项目，而不需要依靠 podspec 类似的文件来管理。</p>
<h2 id="安装Carthage"><a href="#安装Carthage" class="headerlink" title="安装Carthage"></a>安装Carthage</h2><p>Carthage提供了三种安装方法，这里推荐使用<a href="https://brew.sh/" target="_blank" rel="noopener">Homebrew</a>来进行安装:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$brew update</span><br><span class="line">$brew install carthage</span><br></pre></td></tr></table></figure></p>
<p>并通过<code>$brew update</code>来更新carthage版本。</p>
<p>当然你也可以 <a href="https://github.com/Carthage/Carthage/releases" target="_blank" rel="noopener">下载最新版本 .pkg 包</a>，双击安装到你的Mac电脑里，但是当你需要更新carthage版本时需要重新下载安装包安装，非常繁琐。</p>
<p>当你完成安装之后，你可以通过<code>$carthage version</code>来检查carthage是否正确安装。当前最新版本号为0.22.0。</p>
<h2 id="添加框架到应用程序"><a href="#添加框架到应用程序" class="headerlink" title="添加框架到应用程序"></a>添加框架到应用程序</h2><h4 id="创建Cartfile文件"><a href="#创建Cartfile文件" class="headerlink" title="创建Cartfile文件"></a>创建Cartfile文件</h4><p>在开始使用Carthage时，我们需要为应用程序创建一个<code>Cartfile</code>的工程描述文件，这个文件可以被标准的OGDL（<a href="http://ogdl.org/" target="_blank" rel="noopener">Ordered Graph Data Language</a>）工具编辑，我们可以使用xcode或者vim等文字编辑工具打开，这里需要注意的是，系统默认的打开工具是系统自带的文字编辑工具(TextEdit)，该工具具有的智能引号功能会自动将<code>&#39;</code>替换成<code>’</code>，导致Carthage无法识别，在编辑时需要在文本编辑工具的 编辑-&gt;替换 中将智能引号功能取消。 Cartfile是一个描述工程依赖第三方的文件，每个依赖描述包括了所依赖的第三方框架的仓库地址，框架名称以及版本号等信息，Carthage其实等价于Cocoapods里的Podfile。</p>
<p>在创建Cartfile的时候你需要打开终端并通过 <strong>cd</strong> 命令行进入你的应用项目根文件路径（包含项目工程 <strong>.xcodeproj</strong> 文件的文件夹）下：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$cd ~/Path/To/Starter/Project</span><br></pre></td></tr></table></figure></p>
<p>使用<strong>touch</strong>命令创建一个空的Cartfile:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$touch Cartfile</span><br></pre></td></tr></table></figure></p>
<p>接着你可以通过xcode来打开Cartfile文件进行编辑:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">open -a Xcode Cartfile</span><br></pre></td></tr></table></figure></p>
<p>我们可以尝试在Cartfile中添加下列内容并保存:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">github &quot;https://github.com/AFNetworking/AFNetworking.git&quot; ~&gt; 3.0</span><br><span class="line">github &quot;ReactiveCocoa/ReactiveCocoa&quot; &gt;= 2.3.1</span><br></pre></td></tr></table></figure></p>
<p>在上面两句依赖语句中,分别声明了两个框架,可以看出依赖语句是由框架源以及版本号两个主要部分组成的。对于从github上依赖的库,我们在声明了<code>github</code>关键字之后,接上依赖库的github地址便可，当然我们也可以简写这个地址，将其简单的描述成<code>Username/Projectname</code>的形式。而框架版本的描述规则如下：</p>
<ol>
<li><code>&gt;= 1.0</code>代表使用1.0或更高版本</li>
<li><code>~&gt; 1.0</code>代表使用1.0以上但是低于2.0的版本</li>
<li><code>== 1.0</code>代表只能使用指定的1.0版本</li>
</ol>
<p>关于cartfile的编写规则,具体可以参考<a href="https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile" target="_blank" rel="noopener">这里</a>。</p>
<h4 id="构建依赖"><a href="#构建依赖" class="headerlink" title="构建依赖"></a>构建依赖</h4><p>cartfile创建完成之后保存并退出，回到终端并执行下面的命令：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">carthage update --platform iOS</span><br></pre></td></tr></table></figure></p>
<p><code>--platform iOS</code>会让Carthage编译的框架只支持iOS平台,如果你不声明的话,Carthage将会默认为你编译全平台的框架。</p>
<p>执行完update命令，carthage会自动下载和编译所需的第三方框架，当命令执行完成，在你的项目文件夹中会创建一个名为Carthage的文件夹，在~/Carthage/Build/iOS中可以找到编译好的.framework框架。在~/Carthage/Checkouts中则可以找到框架的源码。</p>
<h4 id="在项目中添加框架"><a href="#在项目中添加框架" class="headerlink" title="在项目中添加框架"></a>在项目中添加框架</h4><p>打开项目，点击project，选择target-&gt;General，将需要的framework文件拖到Linken Frameworks and Libraries中:</p>
<p><img src="/img/Carthage-使用手册/carthage-settings.gif" alt="carthage-settings.gif"></p>
<p>在target-&gt;Build Phases设置项中点击 ==+== 按钮并选择 ==New Run Script Pahse== :</p>
<p><img src="/img/Carthage-使用手册/newScript.png" alt="newScript.png"></p>
<p>在run script中加入如下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/local/bin/Carthage copy-frameworks</span><br></pre></td></tr></table></figure></p>
<p>同时在下方的==Input Files==中为每个framework添加地址:</p>
<p><img src="/img/Carthage-使用手册/configScript.png" alt="configScript.png"></p>
<p>这些是为了解决<a href="http://www.openradar.me/radar?id=6409498411401216" target="_blank" rel="noopener">App Store submission bug</a>的方法。</p>
<p>做完这些，你的项目就已经配置好了，现在你已经可以在项目中使用 ==#import &lt;Framework/header.h&gt;== 来调用框架提供的方法了。</p>
<h4 id="更新框架"><a href="#更新框架" class="headerlink" title="更新框架"></a>更新框架</h4><p>如果需要更新框架版本或者添加新的框架,只需打开修改cartfile，保存并重新运行<code>carthage update --platform iOS</code>，carthage将会重新checkout 并编译。</p>
<h2 id="创建框架并支持到Carthage"><a href="#创建框架并支持到Carthage" class="headerlink" title="创建框架并支持到Carthage"></a>创建框架并支持到Carthage</h2><p>由于carthage是iOS8之后才出现的依赖工具，现阶段支持的第三方框架有限，同时，为了方便开发，我们内部也封装了一些常用框架，这个时候，我们可以自己将需要的框架配置支持carthage。</p>
<h4 id="配置Xcode-Project"><a href="#配置Xcode-Project" class="headerlink" title="配置Xcode Project"></a>配置Xcode Project</h4><p>以iOS时间工具库<a href="https://github.com/MatthewYork/DateTools" target="_blank" rel="noopener">DateTools</a>为例，该库提供了丰富的时间日期操作方法，可以大大减少开发时时间计算及时间格式转换等功能代码量，但该库并不支持Carthage。现在我们将其进行支持carthage配置。<br>首先，将DateTools仓库Fork到<a href="https://github.com/GosuncnMobile" target="_blank" rel="noopener">部门github账号</a>下，clone源码到本地。</p>
<p>打开Xcode，选择File-&gt;New-&gt;Project(快捷键==shift+command+N==),选择iOS-&gt;Farmework &amp; Library 选项下的==Cocoa Touch Library==,点击==Next==按钮,进入Product option界面,填写基本的工程信息。</p>
<p><img src="/img/Carthage-使用手册/settingProject.png" alt="settingProject.png"></p>
<p>工程创建完毕后，点开Xcode左上角==scheme==选项并选择==Manage Schemes==</p>
<p><img src="/img/Carthage-使用手册/manageSchemes.png" alt="manageSchemes.png"></p>
<p>将需要构建的==scheme==勾选==Shared==</p>
<p><img src="/img/Carthage-使用手册/shareSchemes.png" alt="shareSchemes.png"></p>
<p>这样Carthage就可以发现该工程。</p>
<h4 id="尝试编译工程"><a href="#尝试编译工程" class="headerlink" title="尝试编译工程"></a>尝试编译工程</h4><p>在进行完上述操作后，你可以尝试将工程编译成framework来测试一下框架能否正确运行。</p>
<p>打开终端，进入到项目文件夹，执行：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$carthage build --no-skip-current</span><br></pre></td></tr></table></figure></p>
<p>命令运行成功后，在项目文件目录中会多一个Carthage的文件夹，在<strong>Carthage-&gt;Build-&gt;iOS</strong>下能找到编译完成的<strong>DateTools.framework</strong>。你可以创建一个新工程并将该framework导入测试工程能否正确运行。<br>如果<code>carhtage build --no-skip-current</code>命令无法成功编译，尝试使用<code>xcodebuild -scheme SCHEME -workspace WORKSPACE build</code> 或 <code>xcodebuild -scheme SCHEME -project PROJECT build</code>命令，看是否出现同样错误，这可以为解决问题提供足够的信息。</p>
<h4 id="提交到GitHub仓库"><a href="#提交到GitHub仓库" class="headerlink" title="提交到GitHub仓库"></a>提交到GitHub仓库</h4><p>如果你的测试工程编译通过了，那么证明你的框架已经搭建成功了，这时候只需将工程提交到github仓库，框架就将支持carthage。</p>
<p>在前面编写cartfile的时候我们知道，版本号是carthage依赖的重要信息，事实上Carthage是通过搜索发布到仓库中的==tag==来决定framework的哪个版本是可用的，并会试着将每个==tag==翻译成 <a href="http://semver.org/lang/zh-CN/" target="_blank" rel="noopener">semantic version</a>（语义化版本）。比如，==tag v1.2==，语义版本是==1.2.0==。没有数字版本号的==tag==，或者在数字版本后跟着其他字符的==tag==（比如：==1.2-alpha-1==）这种版本号目前carthage不提供支持。</p>
<p>所以在提交工程后，还需要为新提交的内容打上==tag==。针对DateTools这种第三方框架，因为之前作者已为稳定的版本打上==tag==，为了保持版本号的统一，可以先将原作者的==tag==删除为新提交的工程打上相同的==tag==。</p>
<h4 id="将预构建的frameworks归档到zip文件"><a href="#将预构建的frameworks归档到zip文件" class="headerlink" title="将预构建的frameworks归档到zip文件"></a>将预构建的frameworks归档到zip文件</h4><p>GtiHub提供了<em>Release</em>功能，如果使用了该功能，在依赖框架时，Carthage会自动使用预构建的framework，而不需要根据代码重新构建。</p>
<p>Carthage提供了framework的构建打包功能，打开工程文件夹，运行下面的命令：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$carthage build --no-skip-current</span><br><span class="line">$carthage archive YourFrameworkName</span><br></pre></td></tr></table></figure></p>
<p>命令执行完成后,你将在工程文件夹中找到一个工程框架的.zip压缩文件。在 github 工程 release 界面，根据对应的版本号，将该zip文件上传上去。</p>
<p>至此，使框架支持Carthage的工作就已经完成了，只要在cartfile上注明依赖，该框架就可通过carthage集成到需要的项目中。</p>
<p>如果需要搭建可支持多平台的框架，可以参考 <a href="http://basememara.com/creating-cross-platform-swift-frameworks-ios-watchos-tvos-via-carthage-cocoapods/" target="_blank" rel="noopener">Creating Cross-Platform Swift Frameworks for iOS, watchOS, and tvOS via Carthage and CocoaPods</a> 这篇文章。</p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol>
<li><a href="https://github.com/Carthage/Carthage/blob/master/README.md" target="_blank" rel="noopener">Carthage README</a></li>
<li><a href="https://www.raywenderlich.com/109330/carthage-tutorial-getting-started" target="_blank" rel="noopener">Carthage Turorial:Getting Started</a></li>
<li><a href="https://robots.thoughtbot.com/creating-your-first-ios-framework" target="_blank" rel="noopener">Creating your first iOS Framework</a></li>
<li><a href="http://devtian.me/2015/08/11/translate-carthage-readme/" target="_blank" rel="noopener">(译)Carthage 使用说明</a></li>
<li><a href="http://www.jianshu.com/p/bf263c596538" target="_blank" rel="noopener">Carthage使用心得-让自己的项目支持Carthage</a></li>
</ol>

      
    </div>
    
  </div>
  
    
    <div class="copyright">
        <p><span>Title:</span><a href="/2018/01/04/Carthage-使用手册/">Carthage 使用手册</a></p>
        <p><span>Author:</span><a href="/" title="Back to Homepage">GosuncnStudio</a></p>
        <p><span>Created:</span>2018-01-04, 10:24:48</p>
        <p><span>Updated:</span>2018-01-08, 13:56:11</p>
        <p>
            <span>Full URL:</span><a class="post-url" href="/2018/01/04/Carthage-使用手册/" title="Carthage 使用手册">https://gosuncnstudio.github.io/2018/01/04/Carthage-使用手册/</a>
            <span class="copy-path" data-clipboard-text="From https://gosuncnstudio.github.io/2018/01/04/Carthage-使用手册/　　By GosuncnStudio" title="Copy Article&#39;s Link &amp; Author"><i class="fa fa-clipboard"></i></span>
            <script> var clipboard = new Clipboard('.copy-path'); </script>
        </p>
        <p>
            <span>License:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" title="CC BY-NC-SA 4.0 International" target = "_blank">"CC BY-NC-SA 4.0"</a> Keep Link &amp; Author if Distribute.
        </p>
    </div>



    <nav id="article-nav">
        
            <div id="article-nav-newer" class="article-nav-title">
                <a href="/2018/01/04/适配iOS-11总结/">
                    适配iOS 11总结
                </a>
            </div>
        
        
            <div id="article-nav-older" class="article-nav-title">
                <a href="/2017/12/27/Android编译时注解/">
                    Android编译时注解
                </a>
            </div>
        
    </nav>

  
</article>

    <div id="toc" class="toc-article">
        <strong class="toc-title">Contents</strong>
        
            <ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#iOS第三方框架管理"><span class="toc-number">1.</span> <span class="toc-text"><a href="#iOS&#x7B2C;&#x4E09;&#x65B9;&#x6846;&#x67B6;&#x7BA1;&#x7406;" class="headerlink" title="iOS&#x7B2C;&#x4E09;&#x65B9;&#x6846;&#x67B6;&#x7BA1;&#x7406;"></a>iOS&#x7B2C;&#x4E09;&#x65B9;&#x6846;&#x67B6;&#x7BA1;&#x7406;</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#CocoaPods"><span class="toc-number">1.0.1.</span> <span class="toc-text"><a href="#CocoaPods" class="headerlink" title="CocoaPods"></a>CocoaPods</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#iOSUniversalLibs"><span class="toc-number">1.0.2.</span> <span class="toc-text"><a href="#iOSUniversalLibs" class="headerlink" title="iOSUniversalLibs"></a>iOSUniversalLibs</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#Carthage"><span class="toc-number">1.0.3.</span> <span class="toc-text"><a href="#Carthage" class="headerlink" title="Carthage"></a>Carthage</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#安装Carthage"><span class="toc-number">2.</span> <span class="toc-text"><a href="#&#x5B89;&#x88C5;Carthage" class="headerlink" title="&#x5B89;&#x88C5;Carthage"></a>&#x5B89;&#x88C5;Carthage</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#添加框架到应用程序"><span class="toc-number">3.</span> <span class="toc-text"><a href="#&#x6DFB;&#x52A0;&#x6846;&#x67B6;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;" class="headerlink" title="&#x6DFB;&#x52A0;&#x6846;&#x67B6;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;"></a>&#x6DFB;&#x52A0;&#x6846;&#x67B6;&#x5230;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#创建Cartfile文件"><span class="toc-number">3.0.1.</span> <span class="toc-text"><a href="#&#x521B;&#x5EFA;Cartfile&#x6587;&#x4EF6;" class="headerlink" title="&#x521B;&#x5EFA;Cartfile&#x6587;&#x4EF6;"></a>&#x521B;&#x5EFA;Cartfile&#x6587;&#x4EF6;</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#构建依赖"><span class="toc-number">3.0.2.</span> <span class="toc-text"><a href="#&#x6784;&#x5EFA;&#x4F9D;&#x8D56;" class="headerlink" title="&#x6784;&#x5EFA;&#x4F9D;&#x8D56;"></a>&#x6784;&#x5EFA;&#x4F9D;&#x8D56;</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#在项目中添加框架"><span class="toc-number">3.0.3.</span> <span class="toc-text"><a href="#&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x6DFB;&#x52A0;&#x6846;&#x67B6;" class="headerlink" title="&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x6DFB;&#x52A0;&#x6846;&#x67B6;"></a>&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x6DFB;&#x52A0;&#x6846;&#x67B6;</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#更新框架"><span class="toc-number">3.0.4.</span> <span class="toc-text"><a href="#&#x66F4;&#x65B0;&#x6846;&#x67B6;" class="headerlink" title="&#x66F4;&#x65B0;&#x6846;&#x67B6;"></a>&#x66F4;&#x65B0;&#x6846;&#x67B6;</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#创建框架并支持到Carthage"><span class="toc-number">4.</span> <span class="toc-text"><a href="#&#x521B;&#x5EFA;&#x6846;&#x67B6;&#x5E76;&#x652F;&#x6301;&#x5230;Carthage" class="headerlink" title="&#x521B;&#x5EFA;&#x6846;&#x67B6;&#x5E76;&#x652F;&#x6301;&#x5230;Carthage"></a>&#x521B;&#x5EFA;&#x6846;&#x67B6;&#x5E76;&#x652F;&#x6301;&#x5230;Carthage</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#配置Xcode-Project"><span class="toc-number">4.0.1.</span> <span class="toc-text"><a href="#&#x914D;&#x7F6E;Xcode-Project" class="headerlink" title="&#x914D;&#x7F6E;Xcode Project"></a>&#x914D;&#x7F6E;Xcode Project</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#尝试编译工程"><span class="toc-number">4.0.2.</span> <span class="toc-text"><a href="#&#x5C1D;&#x8BD5;&#x7F16;&#x8BD1;&#x5DE5;&#x7A0B;" class="headerlink" title="&#x5C1D;&#x8BD5;&#x7F16;&#x8BD1;&#x5DE5;&#x7A0B;"></a>&#x5C1D;&#x8BD5;&#x7F16;&#x8BD1;&#x5DE5;&#x7A0B;</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#提交到GitHub仓库"><span class="toc-number">4.0.3.</span> <span class="toc-text"><a href="#&#x63D0;&#x4EA4;&#x5230;GitHub&#x4ED3;&#x5E93;" class="headerlink" title="&#x63D0;&#x4EA4;&#x5230;GitHub&#x4ED3;&#x5E93;"></a>&#x63D0;&#x4EA4;&#x5230;GitHub&#x4ED3;&#x5E93;</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#将预构建的frameworks归档到zip文件"><span class="toc-number">4.0.4.</span> <span class="toc-text"><a href="#&#x5C06;&#x9884;&#x6784;&#x5EFA;&#x7684;frameworks&#x5F52;&#x6863;&#x5230;zip&#x6587;&#x4EF6;" class="headerlink" title="&#x5C06;&#x9884;&#x6784;&#x5EFA;&#x7684;frameworks&#x5F52;&#x6863;&#x5230;zip&#x6587;&#x4EF6;"></a>&#x5C06;&#x9884;&#x6784;&#x5EFA;&#x7684;frameworks&#x5F52;&#x6863;&#x5230;zip&#x6587;&#x4EF6;</span></a></li></ol></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#参考"><span class="toc-number">5.</span> <span class="toc-text"><a href="#&#x53C2;&#x8003;" class="headerlink" title="&#x53C2;&#x8003;"></a>&#x53C2;&#x8003;</span></a></li></ol>
        
    </div>
    <style>
        .left-col .switch-btn,
        .left-col .switch-area {
            display: none;
        }
        .toc-level-3 i,
        .toc-level-3 ol {
            display: none !important;
        }
    </style>

    <input type="button" id="tocButton" value="Hide"  title="Show or Hide Table of Contents">

    <script>
        yiliaConfig.toc = ["Hide", "Show", !!"false"];
    </script>



    
<div class="share">
    
        <div class="bdsharebuttonbox">
            <a href="#" class="fa fa-twitter bds_twi" data-cmd="twi" title="分享到推特"></a>
            <a href="#" class="fa fa-weibo bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a>
            <a href="#" class="fa fa-qq bds_sqq" data-cmd="sqq" title="分享给 QQ 好友"></a>
            <a href="#" class="fa fa-files-o bds_copy" data-cmd="copy" title="复制网址"></a>
            <a href="#" class="fa fa fa-envelope-o bds_mail" data-cmd="mail" title="通过邮件分享"></a>
            <a href="#" class="fa fa-weixin bds_weixin" data-cmd="weixin" title="生成文章二维码"></a>
            <a href="#" class="fa fa-share-alt bds_more" data-cmd="more"></i></a>
        </div>
        <script>
            window._bd_share_config={
                "common":{"bdSnsKey":{},"bdText":"Carthage 使用手册　| 高新兴移动开发小组　","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
        </script>
    

    
</div>







    
      <div class="duoshuo" id="comments">
    <div id="comment-box" ></div>
    <div class="ds-thread" id="ds-thread" data-thread-key="2018/01/04/Carthage-使用手册/" data-title="Carthage 使用手册" data-url="https://gosuncnstudio.github.io/2018/01/04/Carthage-使用手册/"></div>
    <script>
        var duoshuoQuery = {short_name:""};
        var loadComment = function(){
            var d = document, s = d.createElement('script');
            s.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
            s.async = true; s.charset = 'UTF-8';
            (d.head || d.body).appendChild(s);
        }

        
    </script>
    
    <script> loadComment(); </script>

</div>
    




    <div class="scroll" id="post-nav-button">
        
            <a href="/2018/01/04/适配iOS-11总结/" title="Pre: 适配iOS 11总结">
                <i class="fa fa-angle-left"></i>
            </a>
        

        <a title="Mini Archives"><i class="fa fa-bars"></i><i class="fa fa-times"></i></a>

        
            <a href="/2017/12/27/Android编译时注解/" title="Next: Android编译时注解">
                <i class="fa fa-angle-right"></i>
            </a>
        
    </div>

    <ul class="post-list"><li class="post-list-item"><a class="post-list-link" href="/2018/01/16/svn与Cocoapods联用方法/">svn与Cocoapods联用方法</a></li><li class="post-list-item"><a class="post-list-link" href="/2018/01/04/适配iOS-11总结/">适配iOS 11总结</a></li><li class="post-list-item"><a class="post-list-link" href="/2018/01/04/Carthage-使用手册/">Carthage 使用手册</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/27/Android编译时注解/">Android编译时注解</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/25/Android-statusBar-开发问题汇总/">Android statusBar 开发问题汇总</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/18/Git常用命令简介/">Git常用命令简介</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/15/视频码流格式解析/">视频码流格式解析</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/07/破解摩拜成为私家车的有效方法/">破解摩拜成为私家车的有效方法</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/06/Android内存泄漏总结/">内存泄漏总结</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/05/hexo使用教程/">hexo使用教程</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/05/hexo样式/">hexo样式及md语法教程</a></li><li class="post-list-item"><a class="post-list-link" href="/2017/12/04/GXXVideoPlayer配置/">GXXVideoPlayer配置</a></li></ul>




    <script>
        
    </script>
</div>
      <footer id="footer">
    <div class="outer">
        <div id="footer-info">
            <div class="footer-left">
                <i class="fa fa-copyright"></i> 
                1997-2018 GosuncnStudio
            </div>
            <div class="footer-right">
                <a href="http://hexo.io/" target="_blank" title="A fast, simple &amp; powerful blog framework">Hexo</a>  Theme <a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" title="Another simple and elegant theme for Hexo  v3.5">Yelee</a> by MOxFIVE <i class="fa fa-heart animated infinite pulse"></i>
            </div>
        </div>
        
            <div class="visit">
                
                    <span id="busuanzi_container_site_pv" style='display:none'>
                        <span id="site-visit" title="Site Visitors"><i class="fa fa-user" aria-hidden="true"></i><span id="busuanzi_value_site_uv"></span>
                        </span>
                    </span>
                
                
                    <span>| </span>
                
                
                    <span id="busuanzi_container_page_pv" style='display:none'>
                        <span id="page-visit"  title="Page Hits"><i class="fa fa-eye animated infinite pulse" aria-hidden="true"></i><span id="busuanzi_value_page_pv"></span>
                        </span>
                    </span>
                
            </div>
        
    </div>
</footer>
    </div>
    
    <script src="/js/GithubRepoWidget.js"></script>

<script data-main="/js/main.js" src="//cdn.bootcss.com/require.js/2.2.0/require.min.js"></script>

    <script>
        $(document).ready(function() {
            var iPad = window.navigator.userAgent.indexOf('iPad');
            if (iPad > -1 || $(".left-col").css("display") === "none") {
                var bgColorList = ["#9db3f4", "#414141", "#e5a859", "#f5dfc6", "#c084a0", "#847e72", "#cd8390", "#996731"];
                var bgColor = Math.ceil(Math.random() * (bgColorList.length - 1));
                $("body").css({"background-color": bgColorList[bgColor], "background-size": "cover"});
            }
            else {
                var backgroundnum = 5;
                var backgroundimg = "url(/background/bg-x.jpg)".replace(/x/gi, Math.ceil(Math.random() * backgroundnum));
                $("body").css({"background": backgroundimg, "background-attachment": "fixed", "background-size": "cover"});
            }
        })
    </script>





    <script type="text/x-mathjax-config">
MathJax.Hub.Config({
    tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"]  ],
        processEscapes: true,
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    }
});

MathJax.Hub.Queue(function() {
    var all = MathJax.Hub.getAllJax(), i;
    for(i=0; i < all.length; i += 1) {
        all[i].SourceElement().parentNode.className += ' has-jax';                 
    }       
});
</script>

<script src="//cdn.bootcss.com/mathjax/2.6.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>


<div class="scroll" id="scroll">
    <a href="#" title="Back to Top"><i class="fa fa-arrow-up"></i></a>
    <a href="#comments" onclick="load$hide();" title="Comments"><i class="fa fa-comments-o"></i></a>
    <a href="#footer" title="Go to Bottom"><i class="fa fa-arrow-down"></i></a>
</div>
<script>
    // Open in New Window
    
        $("a[target=_blank]").removeAttr("target");
    
</script>

<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
  </div>
</body>
</html>